#include "sine_wave_phase_menu.h"
#include "menu_config.h"
#include "sine_wave_generator_config.h"

/* 相位调节步长宏定义 */
#define PHASE_SHORT_STEP     5   /* 短按步长(度) */
#define PHASE_LONG_STEP      30  /* 长按步长(度) */

/* 添加全屏刷新标志位 */
static bool needFullRefresh = true;
/* 显示刷新标志，决定是否需要重绘菜单界面 */
static bool sg_needRefresh = true;
/* 存储最大最小值 */
static uint16_t sg_minValue = 0;    /* 最小相位值(度) */
static uint16_t sg_maxValue = 359;  /* 最大相位值(度) */

/* 定义空的菜单项 */
static cotMenuList_t sg_SineWavePhaseMenuTable[] =
{
    COT_MENU_ITEM_BIND(TEXT_SINEWAVE_PHASE_MENU, NULL, NULL, NULL, NULL, "Sine Wave Phase"),
};

/* 显示函数 */
static void ShowSineWavePhaseMenu(cotMenuShow_t *ptShowInfo)
{
    /* 如果不需要刷新显示，直接返回 */
    if (!sg_needRefresh)
    {
        return;
    }

    /* 只有在首次显示或标记需要全刷时才清屏并绘制所有内容 */
    if (needFullRefresh)
    {
        /* 清屏 */
        LCD_Clear();

        /* 显示标题 */
        const char *pszSelectDesc = get_text((TextId_e)ptShowInfo->uMenuDesc.textId);
        uint16_t titleX = CALC_TITLE_CENTER_X(pszSelectDesc, LCD_W);
        LCD_ShowString(titleX, 0, (uint8_t *)pszSelectDesc, g_point_color, g_back_color, MENU_FONT_SIZE, 0);

        /* 画分隔线 */
        LCD_DrawLine(0, MENU_FONT_SIZE, LCD_W - 1, MENU_FONT_SIZE, g_point_color);

        needFullRefresh = false;
    }

    /* 显示设定相位 */
    char valueStr[16];
    sprintf(valueStr, " %d° ", g_tSineWaveParam.phase);
    
    /* 在屏幕中央显示设定相位 */
    uint16_t valueX = (LCD_W - strlen(valueStr) * VALUE_FONT_SIZE/2) / 2;
    uint16_t valueY = LCD_H / 2 - VALUE_FONT_SIZE / 2;
    LCD_ShowString(valueX, valueY, (uint8_t *)valueStr, g_point_color, g_back_color, VALUE_FONT_SIZE, 0);
    
    sg_needRefresh = false;
}

/* 按键回调函数 - 上键(KEY0) */
static void OnKey0FunCB(cotKey_t key)
{
    /* 处理按键短按和长按 */
    if (!cotKey_IsLongPress(key))
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 按下首次触发 */
        {
            /* 预留：首次按下按键时的处理 */
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 识别到短按 */
        {
            /* 增加相位值 */
            uint16_t newValue = g_tSineWaveParam.phase + PHASE_SHORT_STEP;
            if (newValue <= sg_maxValue)
            {
                g_tSineWaveParam.phase = newValue;
                SineWave_Generator_UpdatePhase(newValue);
                sg_needRefresh = true; /* 只标记局部刷新 */
            }
            else 
            {
                /* 处理相位超过最大值，循环到0度 */
                newValue = newValue - 360;
                g_tSineWaveParam.phase = newValue;
                SineWave_Generator_UpdatePhase(newValue);
                sg_needRefresh = true;
            }
        }
    }
    else
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 识别到长按 */
        {
            /* 长按增加相位值 */
            uint16_t newValue = g_tSineWaveParam.phase + PHASE_LONG_STEP;
            if (newValue <= sg_maxValue)
            {
                g_tSineWaveParam.phase = newValue;
                SineWave_Generator_UpdatePhase(newValue);
                sg_needRefresh = true; /* 只标记局部刷新 */
            }
            else
            {
                /* 处理相位超过最大值，循环到小于360的值 */
                newValue = newValue % 360;
                g_tSineWaveParam.phase = newValue;
                SineWave_Generator_UpdatePhase(newValue);
                sg_needRefresh = true;
            }
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 长按松开 */
        {
            /* 预留：长按上键松手时的处理 */
        }
    }
}

/* 按键回调函数 - 下键(KEY1) */
static void OnKey1FunCB(cotKey_t key)
{
    /* 处理按键短按和长按 */
    if (!cotKey_IsLongPress(key))
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 按下首次触发 */
        {
            /* 预留：首次按下按键时的处理 */
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 识别到短按 */
        {
            /* 减少相位值 */
            uint16_t newValue = g_tSineWaveParam.phase;
            if (newValue >= sg_minValue + PHASE_SHORT_STEP)
            {
                newValue -= PHASE_SHORT_STEP;
                g_tSineWaveParam.phase = newValue;
                SineWave_Generator_UpdatePhase(newValue);
                sg_needRefresh = true; /* 只标记局部刷新 */
            }
            else if (newValue > sg_minValue)
            {
                /* 处理小于最小步长的特殊情况，直接设为最小值 */
                g_tSineWaveParam.phase = sg_minValue;
                SineWave_Generator_UpdatePhase(sg_minValue);
                sg_needRefresh = true;
            }
            else if (newValue == sg_minValue)
            {
                /* 处理相位小于0，循环到359度 */
                g_tSineWaveParam.phase = 359;
                SineWave_Generator_UpdatePhase(359);
                sg_needRefresh = true;
            }
        }
    }
    else
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 识别到长按 */
        {
            /* 长按减少相位值 */
            uint16_t newValue = g_tSineWaveParam.phase;
            if (newValue >= sg_minValue + PHASE_LONG_STEP)
            {
                newValue -= PHASE_LONG_STEP;
                g_tSineWaveParam.phase = newValue;
                SineWave_Generator_UpdatePhase(newValue);
                sg_needRefresh = true; /* 只标记局部刷新 */
            }
            else if (newValue > sg_minValue)
            {
                /* 如果不足长按步长，但大于最小值，则设为最小值 */
                g_tSineWaveParam.phase = sg_minValue;
                SineWave_Generator_UpdatePhase(sg_minValue);
                sg_needRefresh = true;
            }
            else if (newValue == sg_minValue)
            {
                /* 处理相位小于0，循环到适当的值 */
                uint16_t wrappedValue = 360 - (PHASE_LONG_STEP - newValue);
                g_tSineWaveParam.phase = wrappedValue;
                SineWave_Generator_UpdatePhase(wrappedValue);
                sg_needRefresh = true;
            }
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 长按松开 */
        {
            /* 预留：长按下键松手时的处理 */
        }
    }
}

/* 按键回调函数 - 确认键(KEY2) */
static void OnKey2FunCB(cotKey_t key)
{
    /* 处理按键短按和长按 */
    if (!cotKey_IsLongPress(key))
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 按下首次触发 */
        {
            /* 预留：首次按下按键时的处理 */
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 识别到短按 */
        {
            /* 保存参数 */
            SineWave_Generator_SaveConfig();
            /* 返回上级菜单 */
            cotMenu_Exit(false);
        }
    }
    else
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 识别到长按 */
        {
            /* 保存参数并返回主菜单 */
            SineWave_Generator_SaveConfig();
            while (cotMenu_Exit(true) == 0)
            {
            }
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 长按松开 */
        {
            /* 预留：长按确认键松手时的处理 */
        }
    }
}

/* 进入回调函数 */
void OnSineWavePhaseMenuEnter(const cotMenuItemInfo_t *ptItemShowInfo)
{
    /* 绑定菜单表和显示函数 */
    cotMenu_Bind(sg_SineWavePhaseMenuTable, COT_GET_MENU_NUM(sg_SineWavePhaseMenuTable), ShowSineWavePhaseMenu);
    
    /* 从参数管理器获取相位最大最小值 */
    const cotParamInfo_t *pParamInfo = GetParamInfo(&g_tSineWaveParam.phase);
    if (pParamInfo != NULL)
    {
        sg_minValue = *pParamInfo->unMinValuePtr.pUint16;
        sg_maxValue = *pParamInfo->unMaxValuePtr.pUint16;
    }
    
    /* 应用当前相位设置 */
    SineWave_Generator_UpdatePhase(g_tSineWaveParam.phase);
}

/* 加载回调函数 */
void LoadSineWavePhaseMenu(const cotMenuItemInfo_t *ptItemShowInfo)
{
    /* 注册按键回调 */
    cotKey_Listen(KEY0, OnKey0FunCB);
    cotKey_Listen(KEY1, OnKey1FunCB);
    cotKey_Listen(KEY2, OnKey2FunCB);

    /* 配置按键模式 */
    cotKey_ConfigLongPressMode(KEY0, 800, 100); /* 上键长按0.8秒触发,每0.1秒重复一次 */
    cotKey_ConfigLongPressMode(KEY1, 800, 100); /* 下键长按0.8秒触发,每0.1秒重复一次 */
    cotKey_ConfigLongPressMode(KEY2, 3000, 0);  /* SET键长按3秒触发,不重复 */
    
    /* 标记需要刷新且全屏刷新 */
    sg_needRefresh = true;
    needFullRefresh = true;
}

/* 任务回调函数 */
void SineWavePhaseMenuTask(const cotMenuItemInfo_t *ptItemShowInfo)
{
    /* 预留：可在此添加菜单定时刷新、动画等功能 */
} 
